package com.fyb.basic.lock.thread;

/**
 * 如何使用 Thread.join() 方法来确保多个线程按照特定的顺序执行。
 */
public class ThreadJoinDemo {

    public static void main(String[] args) {
        // 创建三个线程，分别命名为 T1, T2, T3
        Thread t1 = new Thread(new Task("T1"), "T1");
        Thread t2 = new Thread(new Task("T2"), "T2");
        Thread t3 = new Thread(new Task("T3"), "T3");

        // 启动 t1
        t1.start();
        try {
            // 等待 t1 线程执行完毕
            t1.join();
            // 启动 t2
            t2.start();
            // 等待 t2 线程执行完毕
            t2.join();
            // 启动 t3
            t3.start();
            // 等待 t3 线程执行完毕
            t3.join();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 内部静态类 Task 实现了 Runnable 接口，用于定义线程任务
     */
    private static class Task implements Runnable {
        private String name;

        /**
         * 构造函数，传入任务名称
         * @param name 任务名称
         */
        public Task(String name) {
            this.name = name;
        }

        @Override
        public void run() {
            long startTime = System.currentTimeMillis();
            System.out.println(name + " 开始执行！");
            try {
                // 模拟任务执行时间，随机休眠0-1000毫秒
                Thread.sleep((long) (Math.random() * 1000));
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(name + " 执行完毕！");
            long endTime = System.currentTimeMillis();
            System.out.println(name + " 执行时间:" + (endTime - startTime) + "ms");
            System.out.println("--------------------------------");
        }
    }
}
